#ifndef GEOMETRYTYPES_H
#define GEOMETRYTYPES_H

#include <windows.h>
#include <xnamath.h>
#include <vector>
using std::vector;

#include "Bone.h"

struct Joint
{
	std::string JointName;
	Bone transformFrame;
};

struct JointInfluence
{
	int boneIndex;
	float weight;
};

//PNT = Position | Normal |Texture
struct VertexPNT
{
	VertexPNT(){}
	VertexPNT(	XMFLOAT3 _position, XMFLOAT3 _normal, XMFLOAT2 _texCoord) 
			: position(_position), normal(_normal), texCoord(_texCoord){}
	VertexPNT(float _posX, float _posY, float _posZ, float _normX, float _normY, float _normZ, float _texCoordU, float _texCoordV) 
			: position(_posX,_posY,_posZ), normal(_normX,_normY,_normZ), texCoord(_texCoordU,_texCoordV){}

	XMFLOAT3 position;
	XMFLOAT3 normal;
	XMFLOAT2 texCoord;
};

// PT = Position | Texture
struct VertexPT
{
	VertexPT(){}
	VertexPT(XMFLOAT3 _position, XMFLOAT2 _texCoord) 
			: position(_position), texCoord(_texCoord){}
	VertexPT(float _posX, float _posY, float _posZ, float _texCoordU, float _texCoordV) 
			: position(_posX,_posY,_posZ), texCoord(_texCoordU,_texCoordV){}

	XMFLOAT3 position;
	XMFLOAT2 texCoord;
};

//PNT = Position | Normal |Texture
struct MeshDataPNT
{
	vector<VertexPNT>		vertices;
	vector<unsigned int>	indices;
};

struct MeshDataPT
{
	vector<VertexPT>		vertices;
	vector<unsigned int>	indices;
};

struct AnimatedMeshDataPNT
{
	vector<VertexPNT>				vertices;
	vector<unsigned int>			indices;
	vector<Joint>					joints;
	vector<vector<JointInfluence>>	weights;
};

#endif